/*
* Copyright (c) 2016 ShopJsp. All Rights Reserved.
 * ============================================================================
 * 版权所有 2011 - 今 北京华宇盈通科技有限公司，并保留所有权利。
 * ----------------------------------------------------------------------------
 * 提示：在未取得SHOPJSP商业授权之前，您不能将本软件应用于商业用途，否则SHOPJSP将保留追究的权力。
 * ----------------------------------------------------------------------------
 * 官方网站：http://www.shopjsp.com
 * ============================================================================
*/
package com.hyyt.shopjsp.solr.service.imp;

import com.hyyt.shopjsp.home.service.IShopTopSearchService;
import com.hyyt.shopjsp.product.vo.SearchProductVo;
import com.hyyt.shopjsp.solr.service.ISolrService;
import com.hyyt.shopjsp.solr.utils.SolrServerUtils;
import com.hyyt.shopjsp.util.common.Utils;
import com.hyyt.shopjsp.util.json.FastJsonUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * Solr全文搜索SV
 *
 * @author ankang 2016-08-10 11:39:38
 */
@Service
public class SolrService implements ISolrService {
    /**
     * 加载日志
     */
    Logger logger = Logger.getLogger(SolrService.class);

    /**
     * Solr服务器工具类
     */
    @Resource
    private SolrServerUtils solrServerUtils;

    /**
     * SHOP_热门搜索
     */
    @Resource
    private IShopTopSearchService topSearchService;

    /**
     * 商品搜索
     *
     * @param key           搜索关键字
     * @param type          商品分类
     * @param rp            价格区间[0,100]
     * @param sort          排序；属性-desc|属性-asc
     * @param isSelfSupport 是否自营，1自营，2平台商铺商品
     * @param start         起始记录
     * @param rows          记录数
     * @return 商品集合
     */
    @Override
    public List<SearchProductVo> query(String key, Integer type, String rp, String sort, Integer isSelfSupport, Integer level, int start, int rows) {
        SolrQuery solrQuery = new SolrQuery();
        /**
         * 1、设置搜索关键字
         */
        String keyWord = keyHandler(key);                                   //获取最终关键词
        if (Utils.stringIsNotEmpty(keyWord)) {
            solrQuery.setQuery("productFullName:" + keyWord);      //根据关键词查询
        } else {
            solrQuery.setQuery("*:*");                                      //如果参数为空，则查询全部
        }
        /**
         * 2、设置其它搜索条件
         */
        if (type != null && level != null) {
            solrQuery.addFilterQuery("category_level" + level + ":" + type);    //分类
        }
        if (isSelfSupport != null) {
            solrQuery.addFilterQuery("isSelfSupport:" + isSelfSupport);         //自营
        }
        if (StringUtils.isNotBlank(rp)) {                                        //处理价格区间
            List<Integer> rpList = FastJsonUtils.toList(rp, Integer.class);
            solrQuery.addFilterQuery("salesPrice:[" + rpList.get(0) + " TO " + rpList.get(1) + "]");
        }

        /**
         * 2、设置排序
         */
        if (StringUtils.isNotBlank(sort)) {
            String[] sortArray = sort.split("-");
            SolrQuery.ORDER order;
            order = sortArray[1].equalsIgnoreCase("desc") ? SolrQuery.ORDER.desc : SolrQuery.ORDER.asc;  //判断排序
            solrQuery.setSort(sortArray[0], order);
        }

        /**
         * 3、设置分页
         */
        solrQuery.setStart(start);
        solrQuery.setRows(rows);
        /**
         * 4、设置高亮
         */
        solrQuery.setHighlight(true);
        solrQuery.setHighlightRequireFieldMatch(true);
        solrQuery.setHighlightSimplePre("<font color=\"red\">");
        solrQuery.setHighlightSimplePost("</font>");
        solrQuery.addHighlightField("productFullName");
        /**
         * 5、返回结果
         */
        List<SearchProductVo> searchProductVoListList = null;
        try {
            searchProductVoListList = solrServerUtils.query(solrQuery);
        } catch (SolrServerException e) {
            logger.error("solr服务出错：", e);
        } catch (IOException e) {
            logger.error("solr服务IO出错：", e);
        }
        return searchProductVoListList;
    }

    /**
     * 统计数量
     *
     * @param key           搜索关键字
     * @param type          分类
     * @param rp            价格区间[0,100]
     * @param isSelfSupport 是否自营，1自营，2平台商铺商品
     * @return 商品数量
     */
    @Override
    public int count(String key, Integer type, String rp, Integer isSelfSupport, Integer level) {
        SolrQuery solrQuery = new SolrQuery();
        /**
         * 1、设置搜索关键字
         */
        String keyWord = keyHandler(key);                                   //获取最终关键词
        if (Utils.stringIsNotEmpty(keyWord)) {
            solrQuery.setQuery("productFullName:" + keyWord);      //根据关键词查询
        } else {
            solrQuery.setQuery("*:*");                                      //如果参数为空，则查询全部
        }
        //设置其它搜索条件
        if (type != null && level != null) {
            solrQuery.addFilterQuery("category_level" + level + ":" + type);
        }
        if (StringUtils.isNotBlank(rp)) {
            List<Integer> rpList = FastJsonUtils.toList(rp, Integer.class);
            solrQuery.addFilterQuery("salesPrice:[" + rpList.get(0) + " TO " + rpList.get(1) + "]");
        }
        if (isSelfSupport != null) {
            solrQuery.addFilterQuery("isSelfSupport:" + isSelfSupport);
        }
        return solrServerUtils.count(solrQuery);
    }

    /**
     * 文档新增
     * 策略：如果存在就先删除，再新增，如果不存在直接新增。是否存在的依据是定义的uniqueKey字段即sku.
     *
     * @param productInfo 商品VO
     * @return 状态码
     */
    @Override
    public int addItem(SearchProductVo productInfo, int commitWithinMs) throws Exception {
        return solrServerUtils.addItem(productInfo, commitWithinMs);
    }

    /**
     * 批量文档新增
     * 策略：如果存在就先删除，再新增，如果不存在直接新增。是否存在的依据是定义的uniqueKey字段即sku.
     *
     * @param productInfoList 商品VO集合
     * @return 状态码
     */
    @Override
    public int addItem(List<SearchProductVo> productInfoList, int commitWithinMs) throws Exception {
        return solrServerUtils.addItem(productInfoList, commitWithinMs);
    }


    /**
     * 自动补全
     *
     * @param keyword     搜索关键字
     * @param facetfields 查询字段名，默认是 keyword
     * @return 结果集
     */
    @Override
    public Map<String, List<Map<String, Object>>> autoComplete(String keyword, String... facetfields) throws SolrServerException {
        SolrQuery query = new SolrQuery();
        query.setQuery("*:*");
        query.setRows(0);//不返回结果集
        query.setFacetPrefix(keyword);
        query.setFacetLimit(100);//每个分组最多返回条数
        query.setFacetMinCount(1);//这个表示分组下某一条目的最小数据量
        query.setFacet(true);   //进行Facet查询
        if (facetfields == null) facetfields = new String[]{"name"};
        query.addFacetField(facetfields);   //设置facet查询字段
        Map<String, List<Map<String, Object>>> listMap = null;
        try {
            listMap = solrServerUtils.autoComplete(query);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return listMap;
    }

    /**
     * 查询排序
     *
     * @param solrQuery
     * @param sort
     */
    private static void querySort(SolrQuery solrQuery, String sort) {
        if (!StringUtils.isEmpty(sort) && !StringUtils.isEmpty(sort)) {
            String[] sortClause = sort.split("@");
            if ("desc".equalsIgnoreCase(sortClause[1])) {
                solrQuery.setSort(sortClause[0], SolrQuery.ORDER.desc);
            } else {
                solrQuery.setSort(sortClause[0], SolrQuery.ORDER.asc);
            }
        }
    }

    /**
     * 重建商品索引
     *
     * @param productInfo 商品
     * @return 成功商品数量
     * @throws Exception
     */
    @Override
    public int reIndexItem(SearchProductVo productInfo) throws Exception {
        //删除搜索引擎商品索引
        solrServerUtils.deleteById(productInfo.getProductId(), 10);
        //重建商品索引
        return solrServerUtils.addItem(productInfo, 10);
    }
    
    /**
     * 删除商品索引
     * @throws Exception 
     */
    public int deleteById(SearchProductVo productInfo, int commitWithinMs) throws Exception{
        //删除搜索引擎商品索引
        return solrServerUtils.deleteById(productInfo.getProductId(), 10);
    }

    /**
     * 处理关键字（为组合查询做准备）
     *
     * @param key 关键词
     * @return
     */
    private String keyHandler(String key) {
        List<String> keyList = new ArrayList<>();
        String result = "";
        if (!Utils.stringIsNotEmpty(key)) {
            /*String keyWord = topSearchService.getOneTopSearch();     //获取一条关键词
            if (Utils.stringIsNotEmpty(keyWord)) {
                keyList.add(keyWord);
            }*/
            keyList = null;
        } else if (key.contains(" ")) {
            keyList = Arrays.asList(key.split("\\s+"));               //组合关关键词
        } else {
            key = ClientUtils.escapeQueryChars(key);                       //处理solr的通配符
            keyList.add(key);
        }
        /**
         * 拼装关键词
         */
        if (Utils.collectionIsNotEmpty(keyList)) {
            for (int i = 0; i < keyList.size(); i++) {
                if (i < keyList.size() - 1) {
                    result += keyList.get(i) + "+";
                } else {
                    result += keyList.get(i);
                }
            }
        }
        return result;
    }
}
